package com.sam.designpatterns

// 众所周知我们厂代工手机
abstract class Phone(val name: String) {
    // 省略：打电话，发短信，刚上冲浪等功能
}
//今年新出的水果 12 系列也是这边生产的呢
class IPhone12 : Phone("iPhone 12")
class IPhone12Pro: Phone("iPhone 12 pro")

// 抽象的工厂类
//abstract class Factory(val name: String) {
//    // 泛型相当于 java 中的 <T extends Phone>
//    abstract fun <T : Phone> createPhone(cls: Class<T>):T
//}
//
//class Factory3 : Factory("富土康三号") {
//    override fun <T : Phone> createPhone(cls: Class<T>): T {
//        // 实现比较复杂的创建方式(比如一大堆复杂或者从各处取来的参数)
//        // 这边简单的使用反射生成对象演示
//        return Class.forName(cls.name).newInstance() as T
//    }
//}

object StaticFactory {
    fun  <T : Phone> createPhone(cls: Class<T>): T {
        return Class.forName(cls.name).newInstance() as T
    }
}

// 抽象的工厂类
abstract class Factory(val name: String) {
    // 泛型相当于 java 中的 <T extends Phone>
    abstract fun createIPhone(): Phone
    abstract fun createIPhonePro(): Phone
}

class Factory4 : Factory("富土康四号") {
    override fun createIPhone(): Phone {
         return IPhone12()
    }

    override fun createIPhonePro(): Phone {
        return IPhone12Pro()
    }
}


fun main() {
    // 开启流水线
    val factory = Factory4()
    println("来到工厂：${factory.name}流水线")
    val iPhone12 = factory.createIPhone()
    println("生产了一个 ${iPhone12.name}")
    val iPhone12Pro = factory.createIPhonePro()
    println("又生产了一个 ${iPhone12Pro.name}")
}